package GPSChallenge.vehiculo;

import Excepciones.NoConozcoAlObstaculoException;
import Excepciones.NoConozcoAlVehiculoException;
import Excepciones.NoConozcoLaBanderaException;
import Excepciones.NoConozcoLaSorpresaException;
import GPSChallenge.bandera.Bandera;
import GPSChallenge.bandera.BanderaVacia;
import GPSChallenge.movimiento.Posicion;
import GPSChallenge.obstaculo.ControlPolicial;
import GPSChallenge.obstaculo.Obstaculo;
import GPSChallenge.obstaculo.ObstaculoVacio;
import GPSChallenge.obstaculo.Piquete;
import GPSChallenge.obstaculo.Pozo;
import GPSChallenge.sorpresa.Sorpresa;

import org.jdom2.*;

public class Vehiculo extends ObjetoMovible {
	
	private Estado estado;
	private boolean llegoALaMeta;
	
	public Vehiculo(Estado estado, Posicion posicion){
		
		super(posicion);
		this.estado = estado;
		this.llegoALaMeta = false;
	}
	
	
	public Estado obtenerEstado(){
		
		return this.estado;
	}
	
	public void cambiarEstado(){
		
		this.estado = this.estado.obtenerNuevoEstado();
	}
	
	public boolean llegoALaMeta(){
		
		return this.llegoALaMeta;
	}
	
	public void finalizarRecorrido(){
		
		this.llegoALaMeta = true;
	}
	
	public void interceptarA(Obstaculo unObstaculo) throws NoConozcoAlObstaculoException, NoConozcoAlVehiculoException {

    	this.estado.interceptarA(unObstaculo, this);
    	
    }

	public void interceptarA(Pozo pozo) throws NoConozcoAlObstaculoException, NoConozcoAlVehiculoException {
		
		this.estado.interceptarA(pozo,this);
		
	}
	
	public void interceptarA(Piquete unPiquete) throws NoConozcoAlObstaculoException, NoConozcoAlVehiculoException {
		
		this.estado.interceptarA(unPiquete,this);
	}

	public void interceptarA(ControlPolicial control) throws NoConozcoAlObstaculoException, NoConozcoAlVehiculoException  {
		
		this.estado.interceptarA(control, this);
	}
    
    public void interceptarA(Sorpresa sorpresa) throws NoConozcoLaSorpresaException, NoConozcoAlVehiculoException {
    	
    	this.estado.interceptarA(sorpresa, this);
    	
    }
    
    public void interceptarA(Bandera bandera) throws NoConozcoLaBanderaException, NoConozcoAlVehiculoException {
		
    	this.estado.interceptarA(bandera, this);

    }

	public void interceptarA(ObstaculoVacio obsVacio) throws NoConozcoAlVehiculoException {

		this.estado.interceptarA(obsVacio, this);
		
	}
	


    public void interceptarA(BanderaVacia banderaVacia) throws NoConozcoLaBanderaException, NoConozcoAlVehiculoException {
		
		this.estado.interceptarA(banderaVacia, this);
		
    }
    
    public Element Serializar(){
    	Element elemento = new Element("vehiculo");
    	if(estado.toString()=="4x4"){
    		elemento.setAttribute("estado","4x4");
    	}
    	if(estado.toString()=="Moto"){
    		elemento.setAttribute("estado","Moto");
    	}
    	if(estado.toString()=="Auto"){
    		elemento.setAttribute("estado","Auto");
    	}
    	elemento.addContent(this.obtenerPosicion().Serializar());
    	return elemento;
    }

}
